package com.study.java._02anno_reflec.type;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;

/**
 * <pre>
 *     author : slx
 *     time   : 2020/12/01
 *     desc   :
 * </pre>
 */

/*TypeVariable
泛型变量, 泛型信息在编译时会被转换为一个特定的类型, 而TypeVariable就是用来反映在JVM编译该泛型前的信息.
TypeVariable就是<T>、<C extends Collection>中的变量T、C本身*/
public class TestTypeVariable<K extends Comparable & Serializable, V> {

    K key;
    V value;

    public static void main(String[] args) throws NoSuchFieldException {
        Field fk = TestTypeVariable.class.getDeclaredField("key");
        Field fv = TestTypeVariable.class.getDeclaredField("value");

        TypeVariable keyType = (TypeVariable) fk.getGenericType();
        TypeVariable valueType = (TypeVariable) fv.getGenericType();


        // getName 返回在源码中定义的名字 K、V
        System.out.println(keyType.getName());
        System.out.println(valueType.getName());

        // 获取声明该类型变量的类型 class com.study.java._02anno_reflec.type.TestTypeVariable
        System.out.println(keyType.getGenericDeclaration());
        System.out.println(valueType.getGenericDeclaration());

        // 获取上边界，没有的话返回Object
        /*
        * interface java.lang.Comparable
            interface java.io.Serializable
        * */
        for (Type bound : keyType.getBounds()) {
            System.out.println(bound);
        }
    }
}